package c98数据安全;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5加密工具类
 */
public class MD5Util {

	/**
	 * MD5加密。
	 * <br><br>
	 * 创建人： 袁炜林 <br>
	 * 创建时间：  2017年9月22日 下午3:47:56 <br>
	 *
	 * @param inStr inStr 明文
	 * @return String 加密后的字符串
	 */
	public static String md5Encrypt(String inStr) {
		try {
			//创建加密对象
			MessageDigest digest = MessageDigest.getInstance("MD5");

			//调用加密对象的方法，加密的动作已经完成
			byte[] bs = digest.digest(inStr.getBytes("UTF-8"));
			//接下来，我们要对加密后的结果，进行优化，按照mysql的优化思路走
			//mysql的优化思路：
			//第一步，将数据全部转换成正数：
			String hexString = "";
			for (byte b : bs) {
				//第一步，将数据全部转换成正数：
				//解释：为什么采用b&255
				/*
				 * b:它本来是一个byte类型的数据(1个字节) 255：是一个int类型的数据(4个字节)
				 * byte类型的数据与int类型的数据进行运算，会自动类型提升为int类型 eg: b: 1001 1100(原始数据)
				 * 运算时： b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000
				 * 0000 0000 0000 0000 0000 1111 1111 结果：0000 0000 0000 0000
				 * 0000 0000 1001 1100 此时的temp是一个int类型的整数
				 */
				int temp = b & 255;
				//第二步，将所有的数据转换成16进制的形式
				//注意：转换的时候注意if正数>=0&&<16，那么如果使用Integer.toHexString()，可能会造成缺少位数
				//因此，需要对temp进行判断
				if (temp < 16 && temp >= 0) {
					//手动补上一个“0”
					hexString = hexString + "0" + Integer.toHexString(temp);
				} else {
					hexString = hexString + Integer.toHexString(temp);
				}
			}
			return hexString;
		} catch (NoSuchAlgorithmException e) {
			//TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			//TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "";
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String inStr = MD5Util.md5Encrypt("JAVA中简单的MD5加密类（MD5Utils）");
		System.err.println(inStr);
	}

}